openstack 中的Routes + webob 的 REST API

首先贴一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from __future__ import print_function
from routes import Mapper
import webob.dec
import webob.exc
import routes.middleware
import testtools
class MyController(object):
def getlist(self, mykey):
print("step 4: MyController's getlist(self, mykey) is invoked")
return "getlist(), mykey=" + mykey
class MyApplication(object):
"""Test application to call from router."""
def __init__(self, controller):
self._controller = controller
def __call__(self, environ, start_response):
print("step 3: MyApplication is invoked")
action_args = environ['wsgiorg.routing_args'][1].copy()
try:
del action_args['controller']
except KeyError:
pass
try:
del action_args['format']
except KeyError:
pass
action = action_args.pop('action', None)
controller_method = getattr(self._controller, action)
result = controller_method(**action_args)
start_response('200 OK', [('Content-Type', 'text/plain')])
return [result]
class MyRouter(object):
"""Test router."""
def __init__(self):
route_name = "dummy_route"
route_path = "/dummies"
my_application = MyApplication(MyController())
self.mapper = Mapper()
self.mapper.connect(route_name, route_path,
controller=my_application,
action="getlist",
mykey="myvalue",
conditions={"method": ['GET']})
self._router = routes.middleware.RoutesMiddleware(self._dispatch,
self.mapper)
@webob.dec.wsgify(RequestClass=webob.Request)
def __call__(self, req):
"""Route the incoming request to a controller based on self.map.
If no match, return a 404.
"""
print("step 1: MyRouter is invoked")
return self._router
@staticmethod
@webob.dec.wsgify(RequestClass=webob.Request)
def _dispatch(req):
"""Dispatch the request to the appropriate controller.
Called by self._router after matching the incoming request to a route
and putting the information into req.environ. Either returns 404
or the routed WSGI app's response.
"""
print("step 2: RoutesMiddleware is invoked, calling our _dispatch back")
match_dict = req.environ['wsgiorg.routing_args'][1]
if not match_dict:
return webob.exc.HTTPNotFound()
app = match_dict['controller']
return app
class RoutingTestCase(testtools.TestCase):
def test_router(self):
router = MyRouter()
result = webob.Request.blank('/dummies').get_response(router)
self.assertEqual(result.body, "getlist(), mykey=myvalue")

然后见博客中有较为详细的理解,但是要深入的话还是需要深入阅读文档

Jerky Lu wechat
欢迎加入微信公众号